package yangsw87.basic;

public class J15_Interface {

	public static void main(String[] args) {
		// J15SungJukService sjsrv = new J15SungJukService();
		// 인터페이스는 new 연산자를 통해 객체를 만들 수 없음
		// 반드시 이것을 상속(구현)한 클래스를
		// 통해 객체로 생성할 수 있음
		J15SungJukServiceImpl sjsrv = new J15SungJukServiceImpl();
		// 성적처리에 필요한 기능 (총점, 평균, 학점)들을
		// 인터페이스로 분리해서 추상메서드로 정의하고
		// 그것을 구현implements해서 클래스로 작성
		// J15SungJukService (인터페이스)
		// -> J15SungJukServiceImpl (구현클래스)

		J15SungJukVO sj = new J15SungJukVO("지현", 98, 87, 54);
		// 값을 저장하는 클래스 선언 및 초기화
		
		sj.setTot(sjsrv.getTotal(sj));
		sj.setAvg(sjsrv.getAverage(sj));
		sj.setGrd(sjsrv.getGrade(sj));
		// 총점, 평균, 학점 계산 후
		// 각 변수에 값 저장
		
		System.out.println(sj.toString());
	}
}

// 인터페이스 정의 (~Service)
interface J15SungJukService {
	// 인터페이스가 제공할 메서드 정의
	// 메서드는 서명까지만 작성
	// 이러한 메서드를 추상메서드라 함
	
	// int AAA; // 잘못된 접근자를 사용
	// private int aaa; // 잘못된 접근자를 사용
	// int  AAA=12; // 상수는 가능

	// int getTotal(int kor, int eng, int mat); // 변수가 너무 많아지면 쓰기 불편.
	int getTotal(J15SungJukVO sj); // 그래서 이렇게 사용하면 훨씬 편함.

	double getAverage(J15SungJukVO sj);

	char getGrade(J15SungJukVO sj);
}

// 인터페이스를 구현한 클래스 작성 (~Impl)
class J15SungJukServiceImpl implements J15SungJukService {

	@Override
	public int getTotal(J15SungJukVO sj) {
		int tot = sj.getKor() + sj.getEng() + sj.getMat();
		return tot;
	}

	@Override
	public double getAverage(J15SungJukVO sj) {
		// double avg = (double)(sj.getKor() + sj.getEng() + sj.getMat()) / 3;
		double avg = (double) getTotal(sj) / 3;
		return avg;
		
	}

	@Override
	public char getGrade(J15SungJukVO sj) {
		char grd = '가';
		switch ((int) getAverage(sj) / 10) {
		case 10:
		case 9:
			grd = '수';
			break;
		case 8:
			grd = '우';
			break;
		case 7:
			grd = '미';
			break;
		case 6:
			grd = '양';
		}
		return grd;
	}
}

class J15SungJukVO {
	private String name;
	private int kor;
	private int eng;
	private int mat;

	private int tot;
	private double avg;
	private char grd;

	public J15SungJukVO() {
	}

	public J15SungJukVO(String name, int kor, int eng, int mat) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMat() {
		return mat;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	public int getTot() {
		return tot;
	}

	public void setTot(int tot) {
		this.tot = tot;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}

	public char getGrd() {
		return grd;
	}

	public void setGrd(char grd) {
		this.grd = grd;
	}

	@Override
	public String toString() {
		return "J15SungJukVO [name=" + name + ", kor=" + kor + ", eng=" + eng
				+ ", mat=" + mat + ", tot=" + tot + ", avg=" + avg + ", grd="
				+ grd + "]";
	}

}
